home *** CD-ROM | disk | FTP | other *** search
/ EnigmA Amiga Run 1998 January / EnigmA AMIGA RUN 24 (1997)(G.R. Edizioni)(IT)[!][issue 1998-01 & 02].iso / LISTATI / asldemo.c < prev    next >
C/C++ Source or Header  |  1997-12-10  |  8KB  |  230 lines

  1. //**********************************************************************
  2. //*                                                                    *
  3. //*         Algoritmo per l'apertura di un asl requester               *
  4. //*     Il programma funziona solo sotto O.S. 3.0 o superiore.         *
  5. //* Se avete un  programma che "patcha" l'asl library possono nascere  *
  6. //* problemi per la corretta visualizzazione e utilizzo dei file,      *
  7. //* quindi per vedere il tutto funzionare correttamente dovrete        *
  8. //* disabilitarlo.                                                     *
  9. //*                                                                    *
  10. //**********************************************************************
  11.  
  12. #include <stdio.h>
  13. #include <exec/memory.h>
  14. #include <exec/types.h>
  15. #include <dos/dosasl.h>
  16. #include <intuition/intuition.h>
  17. #include <libraries/asl.h>
  18. #include <string.h>
  19.  
  20. #include <clib/exec_protos.h>
  21. #include <clib/intuition_protos.h>
  22. #include <clib/asl_protos.h>
  23.  
  24.  
  25. extern struct IntuitionBase *intuibase;
  26.        struct Library *aslbase=NULL;
  27.  
  28. //
  29. //  Definizione delle funzioni
  30. //
  31. ULONG  FunzioneHook();
  32. //
  33. //  Inizio programma
  34. //
  35.  
  36. int main (int argc,char **argv)
  37. {
  38.  int i = 0;
  39.  struct FileRequester *my_asl_req =NULL;
  40.  struct Window        *finestra   =NULL;
  41.  struct Screen        *schermo    =NULL;
  42.  //
  43.  // Apriamo le libreria asl
  44.  //
  45.  if ((aslbase=OpenLibrary("asl.library",39L))==NULL)return(-2);
  46.  if ((my_asl_req=AllocAslRequestTags(ASL_FileRequest,TAG_END)))
  47.  {
  48.     //
  49.     // Apriamo ora il file requester più semplice di tutti
  50.     //
  51.   if (AslRequestTags(my_asl_req,TAG_END))
  52.   {
  53.     if (strlen(my_asl_req->fr_File))
  54.         {// stampiamo il nome del file selezionato
  55.             printf ("\n file selezionato: %s",my_asl_req->fr_File);
  56.             if(strlen(my_asl_req->fr_Drawer))printf("\n percorso: %s \n",my_asl_req->fr_Drawer);
  57.         }
  58.   }
  59.   else printf ("\n NON avete selezionato nulla \n");
  60.   //
  61.   //  Facciamo ora un pò di multiselezione ...
  62.   //  Nota:i tags,a meno che no si dia una "ripulita" alla struttura
  63.   //  FileRequester, sono cumulabili. Ad esempio una volta settato
  64.   //  "ASLFR_DoMultiSelect" questo tag resterà valido anche per le
  65.   //  prossime finestre ASL che apriremo, non solo per quella corrente.
  66.   //
  67.   if (AslRequestTags(my_asl_req,
  68.       ASLFR_DoMultiSelect,  TRUE,
  69.       ASLFR_InitialFile,    "",
  70.       TAG_END))
  71.   {
  72.      if (my_asl_req->fr_NumArgs)
  73.         {//stampiamo tutti i files selezionati
  74.          if(strlen(my_asl_req->fr_Drawer))printf("\n percorso: %s \n",my_asl_req->fr_Drawer);
  75.          for(i=0;i<my_asl_req->fr_NumArgs;i++)
  76.          printf("\n file %d: %s",i+1,my_asl_req->fr_ArgList[i].wa_Name);
  77.         }
  78.   }
  79.   else printf ("\n NON avete selezionato nulla \n");
  80.   //
  81.   //  Sempre più difficile! Nell'ordine:
  82.   //  Titolo finestra personalizzato,
  83.   //  tasti "OK" e "ANNULLA" personalizzati ,directory e file di
  84.   //  partenza ,multiselezione,Funzione filtro attiva.
  85.   //
  86.   if (AslRequestTags(my_asl_req,
  87.    ASLFR_TitleText,     "Sempre più personalizzata!",
  88.    ASLFR_PositiveText,  "Va ben!",
  89.    ASLFR_NegativeText,  "Va Via!",
  90.    ASLFR_InitialDrawer, "c:",
  91.    ASLFR_InitialFile,   "",
  92.    ASLFR_DoMultiSelect, TRUE,
  93.    ASLFR_InitialPattern,"D#?",
  94.    ASLFR_DoPatterns,TRUE,
  95.    TAG_END));
  96.   //
  97.   // Supponete di avere un programma ,che gira su finestra ,con
  98.   // un bel gadgettino che serve a salvare il lavoro che avete fatto.
  99.   // Sta per scoppiare la guerra termonucleare e voi per la fretta
  100.   // ci cliccate sopra trecentomila volte in un secondo.
  101.   // Se il programma è strutturato in una certa maniera appariranno
  102.   // contemporaneamente su schermo trecentomila filerequester
  103.   // che chiedono di salvare il frutto dei vostri sforzi.
  104.   // Con un solo tag possiamo evitare tutto questo!
  105.   // Apriamo ora una finestra e settiamo il tag per far comparire
  106.   // il puntatore di attesa quando riclicchiamo sopra la stessa.
  107.   // (Andiamo in modalità salvataggio).
  108.   //
  109.     if((finestra=OpenWindowTags(NULL,
  110.        WA_Top,20, WA_Left,20, WA_Width,400, WA_Height,100,
  111.        WA_Title,"Finestra per ASL",NULL)))
  112.        {
  113.         if (AslRequestTags(my_asl_req,
  114.          ASLFR_TitleText,    "Clicca sulla finestra!",
  115.          ASLFR_Window,       finestra,
  116.          ASLFR_SleepWindow,  TRUE,
  117.          ASLFR_PositiveText, "Salva",
  118.          ASLFR_NegativeText, "Ci ripenso!",
  119.          ASLFR_DoMultiSelect,FALSE,
  120.          ASLFR_DoSaveMode,   TRUE,
  121.          ASLFR_SleepWindow,  TRUE,
  122.          TAG_END));
  123.         CloseWindow(finestra);
  124.        }
  125.      FreeFileRequest(my_asl_req);
  126.     }//  ripuliamo tutto quanto! Facciamo prima che a
  127.      //  settare tutti i tag che non interessano a "FALSE"
  128.      if (my_asl_req=AllocAslRequestTags(ASL_FileRequest,TAG_END))
  129.       {
  130.        if (AslRequestTags(my_asl_req,
  131.         ASLFR_TitleText,   "Solo Cassetti please!",
  132.         ASLFR_DrawersOnly, TRUE,
  133.         TAG_END));
  134.        //
  135.        // Apriamo ora l'asl su uno schermo.
  136.        // Gli altri tags oramai dovreste saperli
  137.        //
  138.        if ((schermo=OpenScreenTags(NULL,
  139.         SA_Width,     640,
  140.         SA_Height,    256,
  141.         SA_Depth,     4,
  142.         SA_DisplayID, HIRES,
  143.         SA_Title,     "Schermo per ASL",
  144.         TAG_END)))
  145.        {
  146.             if (AslRequestTags(my_asl_req,
  147.              ASLFR_DrawersOnly,  FALSE,
  148.              ASLFR_TitleText,    "Uno schermo tutto mio!",
  149.              ASLFR_Screen,       schermo,
  150.              ASLFR_DoPatterns,   TRUE,
  151.              ASLFR_DoMultiSelect,TRUE,
  152.              TAG_END));
  153.         CloseScreen(schermo);
  154.    }
  155.   FreeFileRequest(my_asl_req);
  156.  } //
  157.    // Vediamo ora di utilizzare la funzione Hook definita sotto.
  158.    //
  159.    if (my_asl_req=AllocAslRequestTags(ASL_FileRequest,NULL))
  160.     {
  161.      if((finestra=OpenWindowTags(NULL,
  162.          WA_Top,          20,
  163.          WA_Left,         20,
  164.          WA_Width,        400,
  165.          WA_Height,       100,
  166.          WA_Title,        "Finestra per ASL 2 (con hook)",
  167.          WA_DragBar,      TRUE,
  168.          WA_CloseGadget,  TRUE,
  169.          WA_DepthGadget,  TRUE,
  170.          WA_IDCMP,        IDCMP_RAWKEY|IDCMP_DISKINSERTED|IDCMP_CLOSEWINDOW|
  171.                           IDCMP_ACTIVEWINDOW|IDCMP_DISKREMOVED,
  172.          TAG_END)))
  173.          {
  174.            if (AslRequestTags(my_asl_req,
  175.            ASLFR_TitleText,     "Clicca sulla finestra!",
  176.            ASLFR_Window,        finestra,
  177.            ASLFR_DoMultiSelect, TRUE,
  178.            ASLFR_InitialDrawer, "libs:",
  179.            ASLFR_HookFunc,      ULONG(FunzioneHook),
  180.            ASLFR_Flags1,        FRF_FILTERFUNC|FRF_INTUIFUNC,
  181.            TAG_END));
  182.           CloseWindow(finestra);
  183.          }
  184.     FreeFileRequest(my_asl_req);
  185.     }
  186.   CloseLibrary(aslbase);
  187.   return(0);
  188. }
  189.  
  190.  
  191. ULONG FunzioneHook(ULONG tipo,CPTR oggetto,struct FileRequester* file_req)
  192. {
  193.  long   dato,appo;
  194.  STRPTR nome_file=NULL;
  195.  switch (tipo)
  196.  {
  197.   case FOF_INTUIFUNC:
  198.      { printf("Messaggio dalla finestra: ");
  199.      // Potremmo finire qui ma strafiamo pure...
  200.      dato=((struct IntuiMessage*)oggetto)->Class;
  201.      switch(dato)
  202.      {
  203.        case IDCMP_DISKINSERTED: printf("Inserito un disco!\n");break;
  204.        case IDCMP_DISKREMOVED:  printf("Estratto un disco!\n");break;
  205.        case IDCMP_CLOSEWINDOW:  printf("Finestra da chiudere!\n");break;
  206.        case IDCMP_ACTIVEWINDOW: printf("Finestra attivata\n");break;
  207.        case IDCMP_RAWKEY:   printf("premuto un tasto\n");break;
  208.        default:      printf("Messaggio sconosciuto!\n");break;
  209.      }
  210.      return(oggetto);
  211.      }
  212.   case  FOF_FILTERFUNC:
  213.      {
  214.        nome_file=((struct AnchorPath*)oggetto)->ap_Info.fib_FileName;
  215.        // la struttura AnchorPath è definita in "dos/dosasl.h"
  216.        printf("AslFR: esamino la stringa %s\n",nome_file);
  217.        appo=strlen(nome_file);
  218.        dato=0;
  219.        while(dato<appo)
  220.        {
  221.         if ((nome_file[dato]=='c')|(nome_file[dato++]=='C'))return(FALSE);
  222.         // Ricordate che in caso di successo qui si deve uscire con "FALSE"
  223.        }
  224.        return(TRUE);  // No ci sono "c" nella stringa, pekkato!
  225.      }
  226.   default:printf("\nTipo oggetto non gestito\n");
  227.  }
  228.  return(TRUE);
  229. }
  230.